# 公司：安徽银杰
# 作者：李伟
"""
0、在excel表格里把数据库断言的：
   - 同样用json格式表示： {"sql表达式":"预期结果"}
1、先读取数据出来-- 反序列化 转化字典 ： {"select count(*) from tz_order where order_number = '#orderNumbers#'":1,
"select status from tz_order where order_number = '#orderNumbers#'":1}
2、for循环得到key【sql】 和value【预期数据库查询结果】
3、替换一下sql里的占位符
4、调用数据库封装的方法 执行查询语句 得到数据库查询结果
5、把预期结果和查询结果 断言
6、最后加上日志和异常捕获 + 判空处理。

"""
import json
from tools.handle_replace import replace_mark
from tools.handle_mysql import HandleMysql
from data.my_db import my_db

# assert_sql = """{"select count(*) from tz_order where order_number = '#orderNumbers#'":1,
# "select status from tz_order where order_number = '#orderNumbers#'":1}"""
#
# # 第一步：反序列化 转化字典
# asset_sql = json.loads(assert_sql)
# # 第二步： for循环得到key【sql】 和value【预期数据库查询结果】
# for k,v in asset_sql.items():
#     # 第三步： 替换一下sql里的占位符
#     k = replace_mark(k)
#     # 第四步：调用数据库封装的方法 执行查询语句 得到数据库查询结果
#     sql_result = HandleMysql(**my_db).quey_data(k) # 数据库查询的结果 {'status': 2}
#     # 第五步：把预期结果和查询结果 断言 实际结果 == 预期结果
#     for i in sql_result.values(): # 因为数据库结果的key不固定的 不能通过key取值value .values获取得到实际结果
#         assert i == v
#

from tools.handle_logs import logger
def sql_assert(assert_sql):
    # 判空处理
    if not assert_sql:
        logger.info(".......数据为空......")
        return
    try:
        # 第一步：反序列化 转化字典
        assert_sql = json.loads(assert_sql)
        logger.info(f"转换后的数据{assert_sql}")
        # 第二步： for循环得到key【sql】 和value【预期数据库查询结果】
        for k,v in assert_sql.items():
            # 第三步： 替换一下sql里的占位符
            klist = replace_mark(k)
            # 第四步：调用数据库封装的方法 执行查询语句 得到数据库查询结果
            # 数据库查询的结果 {'status': 2}
            sql_result = HandleMysql(**my_db).quey_data(k)

            for i in sql_result.values():
                # 第五步：把预期结果和查询结果 断言 实际结果 == 预期结果
                # 因为数据库结果的key不固定的，不能通过key取值value.values获取得到实际结果
                assert i == v,f"查询结果与预期不符合：实际值={i},预期值={v},SQL={klist}"
    except json.JSONDecodeError as e:
        logger.info(f"JSON解析错误：{str(e)},原始数据：{assert_sql}")
        logger.info(f"JSON解析错误：{e},原始数据：{assert_sql}")
        #上文两者写法效果一样。
        # raise e
        raise  #最好不要加 e 这样可以保留上下文信息。

    except Exception as e:
        logger.error((f"执行SQL断言发生错误：{str(e)}"))
        raise


# 作用：验证数据库中的数据断言
# 文件加密无法读取。

if __name__ == '__main__':

    assert_sql = """{"select count(*) from tz_order where order_number = '#orderNumbers#'":1, 
    "select status from tz_order where order_number = '#orderNumbers#'":1}"""

    data = sql_assert(assert_sql)
    print(data)
